package view;

import java.awt.Image;
import java.awt.LayoutManager;
import java.util.Arrays;
import java.util.List;

import javax.swing.JPanel;

public abstract class View extends JPanel{
	/**
	 * 
	 */
	private static final long serialVersionUID = -8275954036003625913L;
	/**indica le interfaccie che un controller deve implementare per poter ascoltare correttamente la view*/
	protected static List<Class<?>> interfacesRequired; 
	
	protected String name;
	protected LayoutManager layout;
	protected Image backgroundimage;
	
	public View(String _name){
		super();
		this.name=_name;
	}
	/**costruisce una nuova View con un particolare nome e che richiede, per essere correttamente ascoltata,
	 * l'elenco di tutte le interfacce che un'eventuale controller deve implementare
	 * 
	 * @param _name il nome da associare alla view
	 * @param interfaces le interfacce che devon oessere implementate dal controller
	 */
	public View(String _name,Class<?> ...interfaces){
		this(_name);
		interfacesRequired=Arrays.asList(interfaces);
	}
	/**effettua le operazioni basi quando viene semplicemente richiamata una view: il metodo deve essere dunque richiamato se:
	 * <p>avvi l'applicazione
	 * <p>B.showview() quando dalla view A passi alla view B 
	 * 
	 */
	public abstract void showview();
	
	/**fa in modo che tutti componenti mandino messaggi importanti al particolare controller. Il controller deve implementare
	 * tutti i listener richiesti, altrimenti potrebbero esserci degli errori. Per questo quando si crea il controller, i listener vengono
	 * aggiungi sse viene soddisfatto il fatto che il controller ha almeno tutti i listener richiesti dalla View
	 * 
	 */
	abstract public void addListeners(Controller<? extends View> controller);
	
	/**controlla se il controller passato ha almeno tutte le interfacce necessarie per controllare la view
	 * 
	 * @param c il controller da verificare
	 * @return TRUE se il controller e' adeguato, false altrimenti
	 */
	public boolean isControllervalid(Controller<?> c){
		return (Arrays.asList(c.getClass().getInterfaces())).size()!=0?((Arrays.asList(c.getClass().getInterfaces()).containsAll(interfacesRequired))?true:false):true;
	}
}
